/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.qsdm.es.dao;

import com.qsdm.es.dao.exceptions.IllegalOrphanException;
import com.qsdm.es.dao.exceptions.NonexistentEntityException;
import com.qsdm.es.dao.exceptions.PreexistingEntityException;
import com.qsdm.es.persistence.Competencia;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import com.qsdm.es.persistence.Profesioncompetencia;
import java.util.ArrayList;
import java.util.List;
import com.qsdm.es.persistence.Usuariocompetencia;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.transaction.UserTransaction;

/**
 *
 * @author alberto
 */
public class CompetenciaJpaController extends BasicJpaController {

    public void create(Competencia competencia) throws PreexistingEntityException, Exception {
        if (competencia.getProfesioncompetenciaList() == null) {
            competencia.setProfesioncompetenciaList(new ArrayList<Profesioncompetencia>());
        }
        if (competencia.getUsuariocompetenciaList() == null) {
            competencia.setUsuariocompetenciaList(new ArrayList<Usuariocompetencia>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            
            List<Profesioncompetencia> attachedProfesioncompetenciaList = new ArrayList<Profesioncompetencia>();
            for (Profesioncompetencia profesioncompetenciaListProfesioncompetenciaToAttach : competencia.getProfesioncompetenciaList()) {
                profesioncompetenciaListProfesioncompetenciaToAttach = em.getReference(profesioncompetenciaListProfesioncompetenciaToAttach.getClass(), profesioncompetenciaListProfesioncompetenciaToAttach.getProfesioncompetenciaPK());
                attachedProfesioncompetenciaList.add(profesioncompetenciaListProfesioncompetenciaToAttach);
            }
            competencia.setProfesioncompetenciaList(attachedProfesioncompetenciaList);
            List<Usuariocompetencia> attachedUsuariocompetenciaList = new ArrayList<Usuariocompetencia>();
            for (Usuariocompetencia usuariocompetenciaListUsuariocompetenciaToAttach : competencia.getUsuariocompetenciaList()) {
                usuariocompetenciaListUsuariocompetenciaToAttach = em.getReference(usuariocompetenciaListUsuariocompetenciaToAttach.getClass(), usuariocompetenciaListUsuariocompetenciaToAttach.getUsuariocompetenciaPK());
                attachedUsuariocompetenciaList.add(usuariocompetenciaListUsuariocompetenciaToAttach);
            }
            competencia.setUsuariocompetenciaList(attachedUsuariocompetenciaList);
            em.persist(competencia);
            for (Profesioncompetencia profesioncompetenciaListProfesioncompetencia : competencia.getProfesioncompetenciaList()) {
                Competencia oldCompetencia1OfProfesioncompetenciaListProfesioncompetencia = profesioncompetenciaListProfesioncompetencia.getCompetencia1();
                profesioncompetenciaListProfesioncompetencia.setCompetencia1(competencia);
                profesioncompetenciaListProfesioncompetencia = em.merge(profesioncompetenciaListProfesioncompetencia);
                if (oldCompetencia1OfProfesioncompetenciaListProfesioncompetencia != null) {
                    oldCompetencia1OfProfesioncompetenciaListProfesioncompetencia.getProfesioncompetenciaList().remove(profesioncompetenciaListProfesioncompetencia);
                    oldCompetencia1OfProfesioncompetenciaListProfesioncompetencia = em.merge(oldCompetencia1OfProfesioncompetenciaListProfesioncompetencia);
                }
            }
            for (Usuariocompetencia usuariocompetenciaListUsuariocompetencia : competencia.getUsuariocompetenciaList()) {
                Competencia oldCompetencia1OfUsuariocompetenciaListUsuariocompetencia = usuariocompetenciaListUsuariocompetencia.getCompetencia1();
                usuariocompetenciaListUsuariocompetencia.setCompetencia1(competencia);
                usuariocompetenciaListUsuariocompetencia = em.merge(usuariocompetenciaListUsuariocompetencia);
                if (oldCompetencia1OfUsuariocompetenciaListUsuariocompetencia != null) {
                    oldCompetencia1OfUsuariocompetenciaListUsuariocompetencia.getUsuariocompetenciaList().remove(usuariocompetenciaListUsuariocompetencia);
                    oldCompetencia1OfUsuariocompetenciaListUsuariocompetencia = em.merge(oldCompetencia1OfUsuariocompetenciaListUsuariocompetencia);
                }
            }
            
        } catch (Exception ex) {
            if (findCompetencia(competencia.getId()) != null) {
                throw new PreexistingEntityException("Competencia " + competencia + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Competencia competencia) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            
            Competencia persistentCompetencia = em.find(Competencia.class, competencia.getId());
            List<Profesioncompetencia> profesioncompetenciaListOld = persistentCompetencia.getProfesioncompetenciaList();
            List<Profesioncompetencia> profesioncompetenciaListNew = competencia.getProfesioncompetenciaList();
            List<Usuariocompetencia> usuariocompetenciaListOld = persistentCompetencia.getUsuariocompetenciaList();
            List<Usuariocompetencia> usuariocompetenciaListNew = competencia.getUsuariocompetenciaList();
            List<String> illegalOrphanMessages = null;
            for (Profesioncompetencia profesioncompetenciaListOldProfesioncompetencia : profesioncompetenciaListOld) {
                if (!profesioncompetenciaListNew.contains(profesioncompetenciaListOldProfesioncompetencia)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Profesioncompetencia " + profesioncompetenciaListOldProfesioncompetencia + " since its competencia1 field is not nullable.");
                }
            }
            for (Usuariocompetencia usuariocompetenciaListOldUsuariocompetencia : usuariocompetenciaListOld) {
                if (!usuariocompetenciaListNew.contains(usuariocompetenciaListOldUsuariocompetencia)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Usuariocompetencia " + usuariocompetenciaListOldUsuariocompetencia + " since its competencia1 field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<Profesioncompetencia> attachedProfesioncompetenciaListNew = new ArrayList<Profesioncompetencia>();
            for (Profesioncompetencia profesioncompetenciaListNewProfesioncompetenciaToAttach : profesioncompetenciaListNew) {
                profesioncompetenciaListNewProfesioncompetenciaToAttach = em.getReference(profesioncompetenciaListNewProfesioncompetenciaToAttach.getClass(), profesioncompetenciaListNewProfesioncompetenciaToAttach.getProfesioncompetenciaPK());
                attachedProfesioncompetenciaListNew.add(profesioncompetenciaListNewProfesioncompetenciaToAttach);
            }
            profesioncompetenciaListNew = attachedProfesioncompetenciaListNew;
            competencia.setProfesioncompetenciaList(profesioncompetenciaListNew);
            List<Usuariocompetencia> attachedUsuariocompetenciaListNew = new ArrayList<Usuariocompetencia>();
            for (Usuariocompetencia usuariocompetenciaListNewUsuariocompetenciaToAttach : usuariocompetenciaListNew) {
                usuariocompetenciaListNewUsuariocompetenciaToAttach = em.getReference(usuariocompetenciaListNewUsuariocompetenciaToAttach.getClass(), usuariocompetenciaListNewUsuariocompetenciaToAttach.getUsuariocompetenciaPK());
                attachedUsuariocompetenciaListNew.add(usuariocompetenciaListNewUsuariocompetenciaToAttach);
            }
            usuariocompetenciaListNew = attachedUsuariocompetenciaListNew;
            competencia.setUsuariocompetenciaList(usuariocompetenciaListNew);
            competencia = em.merge(competencia);
            for (Profesioncompetencia profesioncompetenciaListNewProfesioncompetencia : profesioncompetenciaListNew) {
                if (!profesioncompetenciaListOld.contains(profesioncompetenciaListNewProfesioncompetencia)) {
                    Competencia oldCompetencia1OfProfesioncompetenciaListNewProfesioncompetencia = profesioncompetenciaListNewProfesioncompetencia.getCompetencia1();
                    profesioncompetenciaListNewProfesioncompetencia.setCompetencia1(competencia);
                    profesioncompetenciaListNewProfesioncompetencia = em.merge(profesioncompetenciaListNewProfesioncompetencia);
                    if (oldCompetencia1OfProfesioncompetenciaListNewProfesioncompetencia != null && !oldCompetencia1OfProfesioncompetenciaListNewProfesioncompetencia.equals(competencia)) {
                        oldCompetencia1OfProfesioncompetenciaListNewProfesioncompetencia.getProfesioncompetenciaList().remove(profesioncompetenciaListNewProfesioncompetencia);
                        oldCompetencia1OfProfesioncompetenciaListNewProfesioncompetencia = em.merge(oldCompetencia1OfProfesioncompetenciaListNewProfesioncompetencia);
                    }
                }
            }
            for (Usuariocompetencia usuariocompetenciaListNewUsuariocompetencia : usuariocompetenciaListNew) {
                if (!usuariocompetenciaListOld.contains(usuariocompetenciaListNewUsuariocompetencia)) {
                    Competencia oldCompetencia1OfUsuariocompetenciaListNewUsuariocompetencia = usuariocompetenciaListNewUsuariocompetencia.getCompetencia1();
                    usuariocompetenciaListNewUsuariocompetencia.setCompetencia1(competencia);
                    usuariocompetenciaListNewUsuariocompetencia = em.merge(usuariocompetenciaListNewUsuariocompetencia);
                    if (oldCompetencia1OfUsuariocompetenciaListNewUsuariocompetencia != null && !oldCompetencia1OfUsuariocompetenciaListNewUsuariocompetencia.equals(competencia)) {
                        oldCompetencia1OfUsuariocompetenciaListNewUsuariocompetencia.getUsuariocompetenciaList().remove(usuariocompetenciaListNewUsuariocompetencia);
                        oldCompetencia1OfUsuariocompetenciaListNewUsuariocompetencia = em.merge(oldCompetencia1OfUsuariocompetenciaListNewUsuariocompetencia);
                    }
                }
            }
            
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = competencia.getId();
                if (findCompetencia(id) == null) {
                    throw new NonexistentEntityException("The competencia with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            
            Competencia competencia;
            try {
                competencia = em.getReference(Competencia.class, id);
                competencia.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The competencia with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<Profesioncompetencia> profesioncompetenciaListOrphanCheck = competencia.getProfesioncompetenciaList();
            for (Profesioncompetencia profesioncompetenciaListOrphanCheckProfesioncompetencia : profesioncompetenciaListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Competencia (" + competencia + ") cannot be destroyed since the Profesioncompetencia " + profesioncompetenciaListOrphanCheckProfesioncompetencia + " in its profesioncompetenciaList field has a non-nullable competencia1 field.");
            }
            List<Usuariocompetencia> usuariocompetenciaListOrphanCheck = competencia.getUsuariocompetenciaList();
            for (Usuariocompetencia usuariocompetenciaListOrphanCheckUsuariocompetencia : usuariocompetenciaListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Competencia (" + competencia + ") cannot be destroyed since the Usuariocompetencia " + usuariocompetenciaListOrphanCheckUsuariocompetencia + " in its usuariocompetenciaList field has a non-nullable competencia1 field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            em.remove(competencia);
            
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Competencia> findCompetenciaEntities() {
        return findCompetenciaEntities(true, -1, -1);
    }

    public List<Competencia> findCompetenciaEntities(int maxResults, int firstResult) {
        return findCompetenciaEntities(false, maxResults, firstResult);
    }

    private List<Competencia> findCompetenciaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Competencia.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Competencia findCompetencia(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Competencia.class, id);
        } finally {
            em.close();
        }
    }

    public int getCompetenciaCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Competencia> rt = cq.from(Competencia.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
